home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Communication
/
PhoneMemo
/
Source
/
MailComposer.m
< prev
next >
Wrap
Text File
|
1993-11-09
|
9KB
|
346 lines
//----------------------------------------------------------------------------------------------------
//
// MailComposer
//
// Inherits From: Object
//
// Declared In: MailComposer.h
//
// Disclaimer
//
// You may freely copy, distribute and reuse this software and its
// associated documentation. I disclaim any warranty of any kind,
// expressed or implied, as to its fitness for any particular use.
//
//----------------------------------------------------------------------------------------------------
#import "MailComposer.h"
#import "MailSpeaker.h"
@implementation MailComposer
//---------------------------------------------------------------------------------------------------------
// Private Methods
//---------------------------------------------------------------------------------------------------------
- (BOOL)_setPort
{
// Should call this before any remote message to make sure Mail.app is
// running and mailSpeaker's port is current. Get named port 'Mail'.
// This will launch Mail.app if not already. Get named port 'MailSendDemo'
// (this is the one we will actually talk to). Set mailSpeaker's port to be this one.
port_t mailPort = NXPortFromName ("Mail", NULL);
if (mailPort == PORT_NULL)
{
(NXRunAlertPanel ("Accessing Mail", "Unable to connect to Mail.app",
NULL, NULL, NULL));
return NO;
}
mailPort = NXPortFromName ("MailSendDemo", NULL);
if (mailPort == PORT_NULL)
{
(NXRunAlertPanel ("Accessing Mail", "Unable to connect to Mail.app",
NULL, NULL, NULL));
return NO;
}
[mailSpeaker setSendPort: mailPort];
return YES;
}
- _nextText: sender
{
// This method attempts to help manage the UI flow, by moving to
// a TextField's nextText object when possible. This is currently only possible
// by 'tabbing', but tabbing doesn't send an action. This method will
// allow an action to be sent and nextText to be selected when 'return' is
// entered. Only works with TextFields and TextField subclasses. Used by
// 'takeFrom' methods.
if ([sender isKindOf: [TextField class]])
if ([[sender nextText] respondsTo: @selector(selectText:)])
[[sender nextText] selectText:nil];
return self;
}
//---------------------------------------------------------------------------------------------------------
// Initializing and Freeing
//---------------------------------------------------------------------------------------------------------
- init
{
[super init];
mailSpeaker = [[MailSpeaker alloc] init];
return self;
}
- free
{
if (to) free (to);
if (subject) free (subject);
if (cc) free (cc);
if (body) free (body);
if (mailSpeaker) [mailSpeaker free];
return [super free];
}
//---------------------------------------------------------------------------------------------------------
// Accessor Methods
//---------------------------------------------------------------------------------------------------------
- (STR) to
{
return to;
}
- (STR) subject
{
return subject;
}
- (STR) cc
{
return cc;
}
- (STR) body
{
return body;
}
- to: (STR) aString
{
if (! aString) return self;
if (to) free (to);
to = NXCopyStringBuffer (aString);
return self;
}
- subject: (STR) aString
{
if (! aString) return self;
if (subject) free (subject);
subject = NXCopyStringBuffer (aString);
return self;
}
- cc: (STR) aString
{
if (! aString) return self;
if (cc) free (cc);
cc = NXCopyStringBuffer (aString);
return self;
}
- body: (STR) aString
{
if (! aString) return self;
if (body) free (body);
body = NXCopyStringBuffer (aString);
return self;
}
//---------------------------------------------------------------------------------------------------------
// Action Methods
//---------------------------------------------------------------------------------------------------------
- takeToStringValueFrom: sender
{
[self to: (STR)[sender stringValue]];
[self _nextText: sender];
return self;
}
- takeSubjectStringValueFrom: sender
{
[self subject: (STR)[sender stringValue]];
[self _nextText: sender];
return self;
}
- takeCcStringValueFrom: sender
{
[self cc: (STR)[sender stringValue]];
[self _nextText: sender];
return self;
}
- takeBodyStringValueFrom: sender
{
[self body: (STR)[sender stringValue]];
[self _nextText: sender];
return self;
}
- takeRemoteToStringValueFrom: sender
{
// Set To: field in compose window using sender stringValue.
if (! [self _setPort]) return nil;
[mailSpeaker setTo: (STR)[sender stringValue]];
[self _nextText: sender];
return self;
}
- takeRemoteSubjectStringValueFrom: sender
{
// Set Subject: field in compose window using sender stringValue.
if (! [self _setPort]) return nil;
[mailSpeaker setSubject: (STR)[sender stringValue]];
[self _nextText: sender];
return self;
}
- takeRemoteCcStringValueFrom: sender
{
// Set Cc: field in compose window using sender stringValue.
if (! [self _setPort]) return nil;
[mailSpeaker setCc: (STR)[sender stringValue]];
[self _nextText: sender];
return self;
}
- takeRemoteBodyStringValueFrom: sender
{
// Set letter body in compose window using sender stringValue.
if (! [self _setPort]) return nil;
[mailSpeaker setBody: (STR)[sender stringValue]];
[self _nextText: sender];
return self;
}
- remoteOpen: sender
{
// Open a compose window in Mail. Multiple calls to this method
// will open multiple windows. However, all other methods will write
// to the 'oldest' open window. For example , if 3 windows are opened,
// window 1 will be written to until it is closed/delivered, at that point
// window 2 will be written to. (Being a 'key' window has no affect
// on this ordering).
if (! [self _setPort]) return nil;
[mailSpeaker openSend];
return self;
}
- remoteTo: sender
{
// Set To: field in compose window using instance variable.
if (! [self _setPort]) return nil;
if (to) [mailSpeaker setTo: to];
return self;
}
- remoteSubject: sender
{
// Set Subject: field in compose window using instance variable.
if (! [self _setPort]) return nil;
if (subject) [mailSpeaker setSubject: subject];
return self;
}
- remoteCc: sender
{
// Set Cc: field in compose window using instance variable.
if (! [self _setPort]) return nil;
if (cc) [mailSpeaker setCc: cc];
return self;
}
- remoteBody: sender
{
// Set letter body in compose window using instance variable.
if (! [self _setPort]) return nil;
if (body) [mailSpeaker setBody: body];
return self;
}
- remoteCompose: sender
{
// Sets all fields in compose window. If a window is not yet opened
// first remote call will open. If a window already exists, this method will
// overwrite its fields.
[self remoteTo: nil];
[self remoteSubject: nil];
[self remoteCc: nil];
[self remoteBody: nil];
return self;
}
- remoteDeliver: sender
{
// Delivers the compose window. If no window has been opened,
// this method has no affect. Mail.app will present an Alert panel if
// invalid 'To:' data exists in compose window.
if (! [self _setPort]) return nil;
[mailSpeaker deliver];
return self;
}
- remoteComposeAndDeliver: sender
{
// Sets all fields in compose window and delivers. If a window is not yet
// opened first remote call will open. If a window already exists, this method
// will overwrite its fields. Mail.app will present an Alert panel if invalid 'To:'
// data exists in the compose window.
[self remoteCompose: nil];
[self remoteDeliver: nil];
return self;
}
//---------------------------------------------------------------------------------------------------------
// Archiving
//---------------------------------------------------------------------------------------------------------
- read: (NXTypedStream*) aStream
{
[super read: aStream];
NXReadTypes (aStream, "@****", &mailSpeaker, &to, &subject, &cc, &body);
return self;
}
- write: (NXTypedStream*) aStream
{
[super write: aStream];
NXWriteTypes (aStream, "@****", &mailSpeaker, &to, &subject, &cc, &body);
return self;
}
//---------------------------------------------------------------------------------------------------------
// IB Methods
//---------------------------------------------------------------------------------------------------------
- (const char *)getInspectorClassName
{
// This returns the name of the class responsible for managing a custom
// IB Attributes inspector.
return "MailComposerInspector";
}
- (NXImage*) getIBImage
{
// This returns the NXImage instance that will be displayed in IB's File Viewer
// when this class is instantiated.
return [NXImage findImageNamed: "MailComposerIcon"];
}
@end